#ifndef clpack_h
#define clpack_h
//clp包结构

#include <typedef.h>
#include <stdio.h>

#define CLPACK_FILE_VERSION 0x01

//包文件头
typedef struct
{
	byte flags[4];//\0clp
	uint8 type;//程序类型，0X01 可执行、0X02 库、0X03 资源
	uint8 r;
	uint32 nameId;
	uint16 filever;//文件版本
	struct {
		uint16 major;//主版本号
		uint16 minor;//次版本号
		uint16 revision;//修订号
		uint16 build;//构建号
	}version;//版本

	struct {
		uint32 offset;
		uint32 size;
	}strpool;//字符串池

	struct {
		uint32 offset;
		uint32 count;
	}stritem;//字符串描述项

	struct {
		uint32 offset;
		uint32 count;
	}files;//文件描述列表

	struct {
		uint32 offset;
		uint32 size;
	}datas;//数据

	uint32 entryid;//入口

	struct {
		uint32 author;
		uint32 copyright;
		uint32 description;
	}info;
}CL_PACK_FILEHEAD, * PCL_PACKFILEHEAD;

/*//包字符串描述项
typedef struct
{
	uint32 offset;
	uint32 length;
}CL_PACK_STRITEM;*/

//包文件项
typedef struct
{
	uint16 name;//文件名称
	uint8 type;//类型
	uint8 r;
	uint32 offset;//偏移
	uint32 size;//大小
}CL_PACK_FILEITEM;


//包文件项
def_structs(CL_PACKITEM, *PCL_PACKITEM)
{
	cstring name;//名称
	uint32 type;//类型 0x01 代码，0x02 资源文件
	uint32 size;//数据大小
	byte* data;//数据地址
};


//包数据结构
typedef struct
{
	cstring name;//包名称
	cstring file;//文件名称
	cstring path;//文件目录
	uint32 type;//程序类型，0X01 可执行、0X02 库、0X03 资源
	struct {
		uint16 major;//主版本号
		uint16 minor;//次版本号
		uint16 revision;//修订号
		uint16 build;//构建号
	}version;//版本
	uint32 itmcount;//项数量
	CL_PACKITEM* items;//项列表
	byte* strings;//名称数据池
	PCL_PACKITEM entry;//入口项ID
	struct {
		cstring author;
		cstring copyright;
		cstring description;
	}info;
}CL_PACK, * PCL_PACK;

#ifndef _PACK_MAIN

PCL_PACK FileLoadCLPack(string file);
PCL_PACK StreamLoadCLPack(FILE* fs, string file);
PCL_PACK ByteLoadCLPack(byte* bs, uint32 length, string file);

#endif

#endif
